//
//  MainViewController.swift
//  swift-GWYWeiBo
//
//  Created by x on 2017/3/9.
//  Copyright © 2017年 HLB. All rights reserved.
//

import UIKit

class MainViewController: UITabBarController {

    //首先我们懒加载一个按钮  使用关键字lazy懒加载按钮 编译器默认有值就直接返回 没有值在执行闭包里面的代码
    private lazy var pulishBtu = {
        () -> UIButton in
        let btu = UIButton.init()
        btu.setImage(UIImage.init(named: "tabbar_compose_icon_add"), for: UIControlState.normal)
        btu.setImage(UIImage.init(named: "tabbar_compose_icon_add_highlighted"), for: UIControlState.highlighted)
        btu.setBackgroundImage(UIImage.init(named: "tabbar_compose_button"), for: UIControlState.normal)
        btu.setBackgroundImage(UIImage.init(named: "tabbar_compose_button_highlighted"), for: .highlighted)
        //按钮的监听方法
        btu.addTarget(self, action: #selector(pulishBtuOnClick(btu:)), for: UIControlEvents.touchUpInside)
        return btu
    }()//()表示闭包是一个函数在执行  相当一个函数在执行
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //iOS7之前设置tintcolor 只会改变文字的颜色  而图片不会变淡是之后文字和图片就都会变
        //tabBar.tintColor = UIColor.orange
        //创建子控制器
        addChildViewControllers()
        //有两种方法创建加号 
        //1.使用自定义的Tabbar 代替系统的Tabbar
        //2.给在TabBarViewController中多添加一个控制器
        
    }
    
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        //添加加号按钮
        stupPulishBtu()
    }
    //注意: 按钮的点击方法的不能用private来修饰的  应为点击方法是由其他来触发事件层层传递的
    func pulishBtuOnClick(btu: UIButton) ->Void{
        print(#function)
        //1.model出一个控制器
        let navi = UINavigationController(rootViewController: ComposeViewController())
        present(navi, animated: true, completion: nil)
    }
    private func stupPulishBtu() -> Void{
        
        //添加按钮
        tabBar.addSubview(pulishBtu)
        let TABBAR_WIDTH = tabBar.bounds.size.width/CGFloat((viewControllers?.count)!)
        let TABBAR_HEIGHT = tabBar.bounds.size.height
        //1.设置按钮的frame
        //pulishBtu.frame = CGRect.init(x: 2*TABBAR_WIDTH, y: 0, width: TABBAR_WIDTH, height: TABBAR_HEIGHT)
        //2.另一种方法是
        let rect = CGRect(x: 0, y: 0, width: TABBAR_WIDTH, height: TABBAR_HEIGHT)
        pulishBtu.frame = rect.offsetBy(dx: 2*TABBAR_WIDTH, dy: 0)
    }
    
    /// 创建子控制器
    private func addChildViewControllers() ->Void{
        
        //1获取json文件的路径
        let path = Bundle.main.path(forResource: "MainVCSettings.json", ofType: nil)
        //2通过文件路径创建NSData
        if let tempPath = path {
            
            let pathData = NSData.init(contentsOfFile: tempPath)
            //3序列化json数据 -> array 这里pathData也应该要判断  但是当你确定有值你可以在后面加上一个!
            do {
                let pathDic = try JSONSerialization.jsonObject(with: pathData! as Data, options: JSONSerialization.ReadingOptions.mutableContainers)
                 for dic in pathDic as! [[String: String]] {
                    addchildViewController(imageName: dic["imageName"]!, viewControllerName: dic["vcName"]!, title: dic["title"]!)
                }
            } catch  {
                
                //如果我们动态的创建控制器发生异常 那我们直接根据本地来创建控制器
                addchildViewController(imageName: "tabbar_home", viewControllerName: "HomeTableViewController", title: "首页")
                addchildViewController(imageName: "tabbar_message_center", viewControllerName: "MessageTableViewController", title: "消息")
                addchildViewController(imageName: "", viewControllerName: "NullViewController", title: "")
                addchildViewController(imageName: "tabbar_discover", viewControllerName: "DiscoverTableViewController", title: "搜索")
                addchildViewController(imageName: "tabbar_profile", viewControllerName: "ProfileTableViewController", title: "我")
            }
            
            ///使用自定义的Tabbar来增加加好
//            setValue(GWYTabBar.init(), forKey: "tabBar")
//            tabBar.tintColor = UIColor.orange
        }
    }
    
    /// 添加子控制器
    ///
    /// - Parameters:
    ///   - imageName: 子控制器的图片名
    ///   - viewControllerName: 子控制器的对应字符串名称
    ///   - title: 子控制器的标题
    private func addchildViewController(imageName: String, viewControllerName: String, title: String) ->Void{
        //首先把传进来的字符串转换成一个控制器
        //1动态获取命名空间 infoDictionary后面加 !  是告诉编译器字典一定有值 as后面加! 也是要确定有值
        let DynamicNaming = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String
        //2把字符串转换成类 (swift中类名包括命名空间//  告诉编译器占时类型据说AnyClass)
        let viewClass:AnyClass? = NSClassFromString(DynamicNaming+"."+viewControllerName)
        //3.把类名转换成我们需要的控制器类型
        let Controller = viewClass as! UIViewController.Type
        //4.把转换的控制器的初始化  转换过来的控制器必须使用init()来初始化
        let viewController = Controller.init()
        
        //1.1.1设置首页tabbar对应的数据
        viewController.tabBarItem.image = UIImage.init(named: imageName)
        viewController.tabBarItem.selectedImage = UIImage.init(named: imageName + "_highlighted")
        viewController.title = title
        //2.给首页包装一个导航控制器
        let UINav = UINavigationController.init(rootViewController: viewController)
        //3.将导航控制器添加在对应的控制器上
        addChildViewController(UINav)
    }

}
